﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using RRHH.Competencias.Controladores;
using System.Data;
using RRHH.Competencias.Entities;
using System.Text;

namespace WebSite
{
    public partial class RadarChartGenerar : System.Web.UI.Page
    {
        protected string codigoPantalla = "RADARCHART";

        protected void Page_Load ( object sender, EventArgs e )
        {
            if (!Page.IsPostBack)
            {
                if (!Master.ValidarAcceso(codigoPantalla)) Response.Redirect("Inicio.aspx");

                TxtBuscarColaboradorDescripcion.Attributes.Add( "readonly", "readonly" );
                TxtBuscarProcesoDescripcion.Attributes.Add( "readonly", "readonly" );
                               
                this.CargarComboTipoCapacidad();
            }
        }

        protected void TxtBuscarProcesoCodigo_TextChanged ( object sender, EventArgs e )
        {
            long idProceso;
            Proceso proceso;

            TxtBuscarProcesoDescripcion.Text = string.Empty;

            if (string.IsNullOrEmpty( TxtBuscarProcesoCodigo.Text.Trim() )) return;

            if (!long.TryParse( TxtBuscarProcesoCodigo.Text, out idProceso )) return;

            GestorProceso gProceso = new GestorProceso();
            proceso = new Proceso();
            proceso.Id = idProceso;

            try
            {
                gProceso.CompletarBasico( proceso );
            }
            catch (Exception)
            {
                return;
            }

            if (proceso != null)
            {
                TxtBuscarProcesoDescripcion.Text = proceso.Nombre;
            }

            TxtBuscarProcesoCodigo.Focus();
        }

        protected void TxtBuscarColaboradorCodigo_TextChanged ( object sender, EventArgs e )
        {
            long idColaborador;
            Colaborador colaborador;

            TxtBuscarColaboradorDescripcion.Text = string.Empty;

            if (string.IsNullOrEmpty( TxtBuscarColaboradorCodigo.Text.Trim() )) return;

            if (!long.TryParse( TxtBuscarColaboradorCodigo.Text, out idColaborador )) return;

            GestorColaborador gColaborador = new GestorColaborador();
            colaborador = new Colaborador();
            colaborador.IdColaborador = idColaborador;

            try
            {
                gColaborador.CompletarBasico( colaborador );
            }
            catch (Exception)
            {
                return;
            }

            if (colaborador != null)
            {
                TxtBuscarColaboradorDescripcion.Text = colaborador.NombreCompleto;
            }

            TxtBuscarColaboradorCodigo.Focus();   
        }

        protected void BtnGenerar_Click ( object sender, ImageClickEventArgs e )
        {
            string errores;
            Proceso proceso = null;
            Colaborador colaborador = null;
            TipoCapacidad tipo = null;

            if (!this.Validar( out errores ))
            {
                this.RegistrarMensajeJavascript( "Error", errores );
                return;
            }

            if (!string.IsNullOrEmpty( TxtBuscarProcesoCodigo.Text.Trim() ))
            {
                proceso = new Proceso();
                proceso.Id = Convert.ToInt64( TxtBuscarProcesoCodigo.Text.Trim() );
            }

            if (!string.IsNullOrEmpty( TxtBuscarColaboradorCodigo.Text.Trim() ))
            {
                colaborador = new Colaborador();
                colaborador.IdColaborador = Convert.ToInt64( TxtBuscarColaboradorCodigo.Text.Trim() );
            }

            if (DdlBuscarTipoCapacidad.SelectedItem.Value != "-1")
            {
                tipo = new TipoCapacidad();
                tipo.Id = Convert.ToInt64( DdlBuscarTipoCapacidad.SelectedItem.Value );
                tipo.Nombre = DdlBuscarTipoCapacidad.SelectedItem.Text;
            }

            try
            {
                this.CompletarGrillaResultado( proceso, colaborador, tipo, 0 );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo obtener la información." + ex.Message);
                return;
            }

            UdpResultados.Update();
        }

        protected void GrdRadarChartResultados_PageIndexChanging ( object sender, GridViewPageEventArgs e )
        {
            Proceso proceso = null;
            Colaborador colaborador = null;
            TipoCapacidad tipo = null;
            long idProceso;
            long idColaborador;

            if (long.TryParse( TxtBuscarProcesoCodigo.Text, out idProceso ))
            {
                proceso = new Proceso();
                proceso.Id = idProceso;
            }

            if (long.TryParse( TxtBuscarColaboradorCodigo.Text, out idColaborador ))
            {
                colaborador = new Colaborador();
                colaborador.IdColaborador = idColaborador;
            }

            if (DdlBuscarTipoCapacidad.SelectedItem.Value != "-1")
            {
                tipo = new TipoCapacidad();
                tipo.Id = Convert.ToInt64( DdlBuscarTipoCapacidad.SelectedItem.Value );
                tipo.Nombre = DdlBuscarTipoCapacidad.SelectedItem.Text;
            }

            try
            {
                this.CompletarGrillaResultado( proceso, colaborador, tipo, e.NewPageIndex );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo obtener la información. " + ex.Message);
                return;
            }
        }

        protected void GrdRadarChartResultados_RowDataBound ( object sender, GridViewRowEventArgs e )
        {
            if (e.Row.RowType == DataControlRowType.DataRow)
            {
                //Cortamos descripcion a 50 caracteres
                if (e.Row.Cells[2].Text.Length > 50)
                {
                    e.Row.Cells[2].Text = e.Row.Cells[2].Text.Substring( 0, 50 ) + "...";
                }
            }
        }

        protected void BtnExportarExcel_Click ( object sender, ImageClickEventArgs e )
        {
            Proceso proceso = null;
            Colaborador colaborador = null;
            TipoCapacidad tipo = null;
            long idProceso;
            long idColaborador;

            if (GrdRadarChartResultados.Rows.Count == 0)
            {
                this.RegistrarMensajeJavascript( "Error", "No hay capacidades en el listado para obtener la planilla" );
                return;
            }

            if (long.TryParse( TxtBuscarProcesoCodigo.Text, out idProceso ))
            {
                proceso = new Proceso();
                proceso.Id = idProceso;
            }

            if (long.TryParse( TxtBuscarColaboradorCodigo.Text, out idColaborador ))
            {
                colaborador = new Colaborador();
                colaborador.IdColaborador = idColaborador;
            }

            if (DdlBuscarTipoCapacidad.SelectedItem.Value != "-1")
            {
                tipo = new TipoCapacidad();
                tipo.Id = Convert.ToInt64( DdlBuscarTipoCapacidad.SelectedItem.Value );
                tipo.Nombre = DdlBuscarTipoCapacidad.SelectedItem.Text;
            }

            try
            {
                GrdRadarChartResultados.AllowPaging = false;
                this.CompletarGrillaResultado( proceso, colaborador, tipo, 0 );

                GridViewExportUtil.ExcelExport( "radarchart.xls", GrdRadarChartResultados );
            }
            catch (Exception ex)
            {
                this.RegistrarMensajeJavascript( "Error", "No se pudo generar el archivo excel. " + ex.Message );
            }
        }

        protected void BtnExportarReporte_Click ( object sender, ImageClickEventArgs e )
        {
            long idProceso;
            long idColaborador;
            StringBuilder queryString = new StringBuilder();

            if (GrdRadarChartResultados.Rows.Count == 0)
            {
                this.RegistrarMensajeJavascript( "Error", "No hay capacidades en el listado para obtener la planilla" );
                return;
            }

            if (long.TryParse( TxtBuscarProcesoCodigo.Text, out idProceso ))
            {
                queryString.Append( "IdProceso=" + TxtBuscarProcesoCodigo.Text.Trim() );
            }

            if (long.TryParse( TxtBuscarColaboradorCodigo.Text, out idColaborador ))
            {
                queryString.Append( "&IdColaborador=" + TxtBuscarColaboradorCodigo.Text.Trim() );
            }

            if (DdlBuscarTipoCapacidad.SelectedItem.Value != "-1")
            {
                queryString.Append( "&IdTipoCapacidad=" + DdlBuscarTipoCapacidad.SelectedItem.Value );
            }

            ScriptManager.RegisterStartupScript( this, this.GetType(), "Popup1", "window.open('RadarChartImpresion.aspx?" + queryString.ToString() + "','Imprimir','height=300, width=700, status=no, resizable= yes, scrollbars= yes, toolbar= no,location= no, menubar= no');", true );
        }

        private void RegistrarMensajeJavascript ( string nombre, string mensaje )
        {
            mensaje = mensaje.Replace( "'", string.Empty );
            mensaje = mensaje.Replace( "(", string.Empty );
            mensaje = mensaje.Replace( ")", string.Empty );
            mensaje = mensaje.Replace( ",", string.Empty );
            mensaje = mensaje.Replace( ";", string.Empty );
            mensaje = mensaje.Replace( "\"", string.Empty );

            ScriptManager.RegisterStartupScript( this, this.GetType(), nombre, "alert('" + mensaje + "');", true );
        }

        private void CargarComboTipoCapacidad ()
        {
            List<TipoCapacidad> lstCapacidades = new List<TipoCapacidad>();

            TipoCapacidad tipoCapacidad = new TipoCapacidad();
            tipoCapacidad.Id = -1;
            tipoCapacidad.Nombre = "Seleccionar";

            lstCapacidades.Add( tipoCapacidad );

            try
            {
                GestorEnumerador<TipoCapacidad> gestorTipoCapacidad = new GestorEnumerador<TipoCapacidad>();
                lstCapacidades.AddRange( gestorTipoCapacidad.Enumeracion );
            }
            catch (Exception) { }

            DdlBuscarTipoCapacidad.DataSource = lstCapacidades;
            DdlBuscarTipoCapacidad.DataTextField = "Nombre";
            DdlBuscarTipoCapacidad.DataValueField = "Id";
            DdlBuscarTipoCapacidad.DataBind();
        }

        private bool Validar ( out string errores )
        {
            errores = string.Empty;

            long idProceso = 0;

            if (!string.IsNullOrEmpty( TxtBuscarProcesoCodigo.Text ) &&
                !long.TryParse( TxtBuscarProcesoCodigo.Text, out idProceso ))
            {
                errores = "Debe indicar un proceso valido";
                return false;
            }

            long idColaborador = 0;

            if (!string.IsNullOrEmpty( TxtBuscarColaboradorCodigo.Text ) &&
                !long.TryParse( TxtBuscarColaboradorCodigo.Text, out idColaborador ))
            {
                errores = "Debe indicar un colaborador valido";
                return false;
            }

            if (idProceso <= 0 && idColaborador <= 0)
            {
                errores = "Debe indicar un colaborador o un proceso";
                return false;
            }

            return true;
        }

        protected void CompletarGrillaResultado ( Proceso proceso, Colaborador colaborador, TipoCapacidad tipo, int pagina )
        {
            GestorRadarChart gRadarChart = new GestorRadarChart();
            DataTable tablaResultado = null;
            RadarChart chart;

            if (proceso != null && colaborador != null)
            {
                chart = gRadarChart.ObtenerDatosRadarChart( proceso, colaborador );
            }
            else
            {
                if (colaborador != null)
                {
                    chart = gRadarChart.ObtenerDatosRadarChart( colaborador );
                }
                else
                {
                    chart = gRadarChart.ObtenerDatosRadarChart( proceso );
                }
            }

            tablaResultado = gRadarChart.GenerarTabla( chart, tipo );

            //Bloque para la generacion del esquema XML, para el diseño del reporte
            /*using (StreamWriter writer = new StreamWriter(Server.MapPath("XMLRadarChart_DS.xsd")))
            {
                tablaResultado.WriteXmlSchema(writer);
                writer.Close();
            }*/

            GrdRadarChartResultados.DataSource = tablaResultado;
            GrdRadarChartResultados.PageIndex = pagina;
            GrdRadarChartResultados.DataBind();
        }

    }
}